#!/usr/bin/pythonrun_cmdb
# encoding: utf-8;
# from importlib.resources import path
import os
import os.path
from stat import *
import sys

sys.path.append("../../..")
from s2c.tools.dict import service_app
from s2c.tools.utils import read_file, write_file, run_cmdb
from s2c.rules.conf import DOCKER_PATH_TMP

# =============nginx相关依赖文件配置==========start===========================
# Nginx 默认的config文件
nginx_cfg = '/etc/nginx/nginx.conf'
# Nginx 需要匹配的规则,注意，如果关键字中有相互包含，需要把唯一的关键字放在前面，如：'ssl_certificate_key', 'ssl_certificate'
nginx_keyword = ['ssl_certificate_key', 'ssl_certificate', 'root', 'access_log', 'error_log', 'include']
# Nginx 需要手动copy的文件
nginx_default_file = ['/var/lib/nginx', '/usr/lib64/perl5', '/usr/share/perl5', '/usr/lib64/libgd.so.3',
                      '/usr/lib64/libfontconfig.so.1', '/usr/lib64/libfreetype.so.6', '/usr/lib64/libX11.so.6',
                      '/usr/lib64/libxcb.so.1', '/usr/lib64/libXau.so.6', '/usr/lib64/libxslt.so.1',
                      '/usr/lib64/libexslt.so.0']


# =============nginx相关依赖文件配置==========end===========================

#  根据需要匹配的关键字做解析
def nginx_analysis_line_str(line_str):
    line_str = line_str.strip()
    line_str = line_str.strip(' ')
    # print('========', line_str)
    # 如果第一个字符是#号表示该行已经被注解掉
    if line_str[0: 1] == '#':
        return False
    # print('========', line_str)
    for key in nginx_keyword:
        # 查找匹配配置目录
        index = line_str.find(key)
        # print('===key index=====' + key + ' = ', index)
        if index >= 0:
            # 找出匹配配置的文件路径
            end = line_str.find(';')
            # print('===key index==end===' + key + ' = ', end)
            file_path = line_str[index + len(key): end]
            dir_str = file_path.strip()
            # dir_str = os.path.dirname(file_path.strip())
            # 如果是文件或者路径直接返回
            if os.path.isdir(dir_str):
                # print('find path a=', dir_str)
                return dir_str
            if os.path.isfile(dir_str):
                dir_str = os.path.dirname(file_path.strip())
                return dir_str
            # 如果不是文件或者路径，在进行截取，截取最后一层的文件路径
            # 如：/var/log/nginx/access.log  main;
            # 如：/etc/nginx/default.d/*.conf;
            path_index = dir_str.rfind('/')
            dir_str = dir_str[0: path_index]
            # print('=======----------------', dir_str)
            # 在次判断是否是文件或者文件夹，
            if os.path.isdir(dir_str) or os.path.isfile(dir_str):
                # print('find path b=', dir_str)
                return dir_str
            else:
                print('nginx config error', dir_str)
                break
    return False


# 解析Nginx包含的root文件
def nginx_include_dir(path):
    # 安装后的默认配置文件
    # path = 'D:\\Work\\2022\\Linux\\data\\nginx\\ok\\pyton\\sites-enabled\\'
    file_list = os.listdir(path)
    dir_arr = []
    for line in file_list:
        # print('======', line)
        # 并对Nginx的config进行分析找出include包含的文件目录和文件
        file = read_file(path + line)
        if file is False:
            continue
        arr_data = file.split('\n')
        for item in arr_data:
            path_file = nginx_analysis_line_str(item)
            if path_file != False:
                dir_arr.append(path_file)

    # 对数组进行去重操作
    dir_arr = list(set(dir_arr))
    return dir_arr


# 解析Nginx include 包含的文件、另外还有default /etc/nginx文件目录
def nginx_config_dir():
    # 安装后的默认配置文件
    dir = [
        '/etc/nginx'
    ]
    # 通过获取配置文件找到配置的前端文件
    # 并对Nginx的config进行分析找出include包含的文件目录和文件
    file = read_file(nginx_cfg)
    if file is False:
        print('not find nginx "' + nginx_cfg + '" file')
        return
    arr_data = file.split('\n')

    for line_str in arr_data:
        path_file = nginx_analysis_line_str(line_str)
        if path_file != False:
            dir.append(path_file)

    # print('====dir====', dir)
    # 对数组进行去重操作
    dir = list(set(dir))
    # 遍历每个路径
    ret_arr = []
    # todo 以后需要增加Nginx.conf中配置的前端资源文件，如root 对应的目录
    for path in dir:
        # 如不是文件夹并且不是文件，并且有带*号表示类似路径
        # /etc/nginx/conf.d/*.conf
        if os.path.isdir(path) == False and os.path.isfile(path) == False and path.find('*') > 0:
            # *号进行分割，取出*好前的数据
            tmp_arr = path.split('*')
            left_str = tmp_arr[0]
            # 查找字符串右边第一个/的位置，并取出左边的路径
            index = left_str.rfind('/')
            out_str = left_str[0: index]
            if os.path.isdir(out_str):
                ret_arr.append(out_str)
                # 对配置的文件进行遍历找出新的路径
                tmp_arr = nginx_include_dir(out_str)
                if len(tmp_arr) > 0:
                    # 数组拼接
                    # ret_arr.extend(tmp_arr)
                    ret_arr += tmp_arr
            else:
                print('===error==path=', path)
        else:
            ret_arr.append(path)

    # 对数组进行去重操作
    ret_arr = list(set(ret_arr))
    return ret_arr


# 启动配置设置
def nginx_boot():
    tmp = DOCKER_PATH_TMP + 'run/php-fpm/www.sock'
    if os.path.exists(tmp):
        run_cmdb('\\rm ' + tmp)
    return 'CMD ["nginx","-g","daemon off;"]\n\n#docker build -t autobuildnginx:00 .\n#docker run 指令 docker run --name my-nginx-new -d -p 8090:80 autobuildnginx:00 nginx -g "daemon off;"\n\n#docker run --name my-nginx-new -d -p 8090:80 --privileged=true autobuildnginx:00 /sbin/init\n\n'


#  man 方法
def main():
    print("Hello, nginx!")
    # tmp = nginx_config_dir()
    ret = os.path.isdir('D:\\Work\\2022\\iot\\20220816\\main.c')
    print('=======', ret)


if __name__ == "__main__":
    main()
